# -*- coding: utf-8 -*-
"""
项目名称：NoSql_kafka_project
文件名称：flask_app.py.py
创建时间：2025-06-05 16:20:22

系统用户：Administrator
作　　者：無以菱
联系邮箱：huangjing2001.guet@qq.com
功能描述：
- 功能：提供Web界面展示统计结果
- 访问地址：http://localhost:5000
- API端点：/api/stats（返回最新统计数据）
- 页面：支付方式金额统计图表（带自动刷新）
"""
from flask import Flask, render_template, jsonify 
import redis  
import json 
import logging  
import sys  
from config import REDIS_CONFIG  # 导入Redis配置

# 配置日志
# 设置日志级别为INFO，格式包含时间、名称、级别和消息
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
# 获取当前模块的logger
logger = logging.getLogger(__name__)

# 初始化Flask应用
# __name__参数用于确定应用的根路径
app = Flask(__name__)

# 初始化Redis连接（使用配置文件参数）
def get_redis_client():
    """
    创建并返回Redis客户端连接
    
    使用配置文件中的参数连接到Redis服务器
    
    返回:
        redis.Redis: 成功时返回Redis客户端对象，失败时返回None
    """
    try:
        # 使用配置文件中的参数创建Redis客户端
        client = redis.Redis(
            host=REDIS_CONFIG['host'],
            port=REDIS_CONFIG['port'],
            db=REDIS_CONFIG['db']
        )
        # 测试连接是否成功
        client.ping()
        logger.info("Redis连接成功")
        return client
    except Exception as e:
        # 连接失败时记录错误并返回None
        logger.error(f"Redis连接失败: {e}")
        return None

# 创建全局Redis客户端实例
redis_client = get_redis_client()

@app.route('/')
def dashboard():
    """
    主页面路由处理函数
    
    返回渲染后的dashboard.html模板，显示支付统计数据的可视化图表
    
    返回:
        str: 渲染后的HTML页面内容
    """
    return render_template('dashboard.html')

@app.route('/api/stats')
def get_stats():
    """
    API端点，返回最新的统计数据
    
    从Redis读取统计数据并以JSON格式返回
    
    返回:
        Response: 包含统计数据的JSON响应
    """
    try:
        if redis_client:
            # 从Redis获取统计数据
            stats_json = redis_client.get(REDIS_CONFIG['stats_key'])
            if stats_json:
                # 解析JSON数据并返回
                stats = json.loads(stats_json)
                return jsonify(stats)
            else:
                # Redis中没有找到数据
                logger.warning("Redis中没有找到统计数据")
                return jsonify([])
        else:
            # Redis客户端未连接
            logger.error("Redis客户端未连接")
            return jsonify({"error": "Redis连接失败"}), 500
    except Exception as e:
        # 处理其他异常
        logger.error(f"获取统计数据时出错: {e}")
        return jsonify({"error": str(e)}), 500

def run_flask_app():
    """
    启动Flask Web应用
    
    配置并运行Flask Web服务器
    """
    logger.info("Flask应用启动，访问 http://localhost:5000 查看统计")
    # 启动Flask应用
    # debug=True: 启用调试模式，自动重载代码
    # host='0.0.0.0': 监听所有网络接口
    # port=5000: 使用5000端口
    # use_reloader=False: 禁用自动重载器，避免在线程中运行时出现问题
    app.run(debug=True, host='0.0.0.0', port=5000, use_reloader=False)


if __name__ == "__main__":
    # 单独运行此文件时执行
    logger.info("正在启动Flask应用进行调试...")
    try:
        # 可以在这里添加测试数据到Redis
        if redis_client:
            # 创建一些测试数据
            test_data = [
                {"PAYWAY": "支付宝", "PAY_AMOUNT": 1234.56},
                {"PAYWAY": "微信", "PAY_AMOUNT": 789.01},
                {"PAYWAY": "银行卡", "PAY_AMOUNT": 456.78}
            ]
            # 将测试数据存入Redis
            redis_client.set(REDIS_CONFIG['stats_key'], json.dumps(test_data))
            logger.info(f"已添加测试数据到Redis: {test_data}")

        # 启动Flask应用
        run_flask_app()
    except KeyboardInterrupt:
        # 处理键盘中断（Ctrl+C）
        logger.info("Flask应用已停止")
    except Exception as e:
        # 处理其他异常
        logger.error(f"Flask应用运行出错: {e}")
        sys.exit(1)  # 非正常退出，返回错误码1